/*	NIM			: 13509020
*	Nama		: Restu Arif Priyono
*	File			: waktu1.1.h
*	Deskripsi	: class waktu untuk mengatur segala bentuk perubahan waktu dan mengatur terjadinya bencana
*/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#ifndef waktu_H
#define waktu_H
class waktu
// 	class waktu sebagai pengatur waktu setiap player melakukan aksi
/* 	class waktu dapat digolongkan ke dalam dua jenis penggunaan, yaitu pengubah waktu, dan mengatur waktu untuk terjadinya bencana.
*	DEFINISI WAKTU:
*	satu hari dalam permainan ini terdiri dari 24 jam. Hari akan berganti setiap waktu sudah melebihi pukul 23.45. player akan terbangun kembali pada pukul 4 keesokan harinya.
*	satu tahun terdiri dari 12 bulan. setiap bulannya terdiri dari 30 hari. pergantian musim akan terjadi setiap 3 bulan sekali.
*	PENGUBAH WAKTU:
*	setiap player melakukan aksi, waktu akan bertambah. setiap aksi normal, akan memakan 30 menit satuan waktu. untuk kasus tidak normal:
*	penambah waktu cepat: waktu akan bertambah satu jam setiap satu aksi yang dilakukan player
*	penambah waktu lambat: waktu akan bertambah 15 menit setiap satu aksi yang dilakukan player.
*	MUSIM
*	bulan 1-3	: musim semi
*	bulan 4-6	: musim badai
*	bulan 7-9	: musim gugur
*	bulan 10-12: musim hujan
*/
{
public:
	//konstruktor kelas waktu, untuk membuat objek waktu
	waktu();
	
	//konstruktor lain kelas waktu
	//HH : tanggal, BB : bulan, MU : musim, JJ : jam, MM : menit
	waktu(int HH,int BB,int MU,int JJ,int MM);
	
	//copy constructor waktu
	waktu(const waktu&);
	
	//destructor
	//destructor waktu
	~waktu();
	
/*	berikut ini adalah keterangan identitas musim yang akan menjadi pembeda dari musim yang lain:
*	musim semi 			= 1
*	musim badai 		= 2
*	musim gugur 		= 3
*	musim penghujan 	= 4
*/
	
	//berikut ini adalah method Get dan Set untuk mendapatkan keterangan dari atribut dalam class waktu
	//mengambil keterangan current tanggal
	int GetHH();
	//mengambil keterangan current bulan
	int GetBB();
	//mengambil keterangan current musim
	int GetMU();
	//mengambil keterangan current jam
	int GetJJ();
	//mengambil keterangan current menit
	int GetMM();
	//mengembalikan jenis current bencana, dengan mengembalikan angka dari keterangan identitas bencana di atas.
	int GetBencana();
	//mengambil keterangan current musim
	int GetMusim();
	//mengambil keterangan counter bencana hujan
	int GetHujan();
	//mengambil keterangan counter bencana topan
	int GetTopan();
	//mengambil keterangan counter bencana razia
	int GetRazia();
	//mengambil keterangan counter bencana crop circle
	int GetCC();
	
	//mengatur isi tanggal
	void SetHH(int NewHH);
	//mengatur isi bulan
	void SetBB(int NewBB);
	//mengatur isi musim
	void SetMU(int NewMU);
	//mengatur isi jam
	void SetJJ(int NewJJ);
	//mengatur isi menit
	void SetMM(int NewMM);
	//mengatur isi bencana
	void SetBencana(int NewBencana);
	
	//mehod lain yang berhubungan dengan jam
	//inisialisasi waktu mulai permainan. method ini akan mengembalikan waktu default awal saat player baru pertama kali memulai bermain (tidak load). method ini akan mengembalikan waktu pada jam 4, menit ke 0, tanggal 1, bulan 1, musim 1.
	void waktuMulai();
	//method ini adalah inisialisasi waktu bencana, semua nilai di set dengan nilai waktu mulai.
	void initBencana();
	//penambah setiap satuan aksi dalam kondisi normal (1 aksi = 1 satuan waktu). jika player tidak terkena pengaruh apapun dari tanaman yang dipakainya, maka waktu akan berjalan dengan normal, yaitu penambahan waktu akan terjadi setiap 30 menit.
	void penambahWktNormal();
	//penambah setiap satuan aksi dalam kondisi tidak normal (1 aksi = 2 satuan waktu). jika player terkena pengaruh cepat karena tanaman yang dipakainya, maka waktu akan berjalan dengan cepat, yaitu penambahan waktu akan terjadi setiap 1 jam.
	void penambahWktCepat();
	//penambah setiap satuan aksi dalam kondisi tidak normal (1 aksi = 1/2 satuan waktu). jika player terkena pengaruh lambat karena tanaman yang dipakainya, maka waktu akan berjalan dengan lambat, yaitu penambahan waktu akan terjadi setiap 30 menit.
	void penambahWktLambat();
	//metode untuk mengembalikan waktu jika player tidur karena telah melewati puku, 23.45. player akan bangun kembali dengan waktu yang sudah di atur pada jam 4, menit 0, di hari berikutnya.
	void sleep();

	//menyimpan informasi mengenai musim
//	int musim();

	//method untuk mengganti musim setiap 3 bulan sekali
	void gantiMusim();
	//method untuk mengganti bulan setiap 30 hari sekali
	void gantiBulan();
	//menampilkan currnet waktu pada layar
	void printWaktu();
	//method untuk mengatur terjadinya bencana, dengan random
	void bencana();
	//menampilkan bencana apa saja yang sedang terjadi pada suatu waktu tertentu.
	void printBencana();
	
	//predikat MUSIM
	//mengembalikan nilai 1 jika pada waktu sekarang adalah musim semi, atau mengembalikan nilai 0 jika waktu sekarang bukan musim semi
	int isSemi();
	//mengembalikan nilai 1 jika pada waktu sekarang adalah musim badai, atau mengembalikan nilai 0 jika waktu sekarang bukan musim badai
	int isBadai();
	//mengembalikan nilai 1 jika pada waktu sekarang adalah musim gugur, atau mengembalikan nilai 0 jika waktu sekarang bukan musim gugur
	int isGugur();
	//mengembalikan nilai 1 jika pada waktu sekarang adalah musim hujan, atau mengembalikan nilai 0 jika waktu sekarang bukan musim hujan
	int isPenghujan();
	//mengembalikan nilai 1 jika pada waktu sekarang sedang terjadi hujan, atau mengembalikan nilai 0 jika waktu sekarang sedang tidak terjadi hujan.
	int isHujan();
	//mengembalikan nilai 1 jika pada waktu sekarang sedang terjadi topan, atau mengembalikan nilai 0 jika waktu sekarang sedang tidak terjadi topan.
	int isTopan();
	//mengembalikan nilai 1 jika pada waktu sekarang sedang terjadi razia, atau mengembalikan nilai 0 jika waktu sekarang sedang tidak terjadi razia.
	int isRazia();
	//mengembalikan nilai 1 jika pada waktu sekarang sedang terjadi crop circle, atau mengembalikan nilai 0 jika waktu sekarang sedang tidak terjadi crop circle.
	int isCropCircle();
	//method untuk menghitung terjadinya suatu bencana
	void countBencana();
	//method untuk menginisialisasi counter bencana, mengisi semuanya dengan nilai 0
	void resetCounter();
	
		//method gejala alam
		//method untuk mengatur waktu terjadinya hujan
		//hujan akan mengakibatkan suatu tanaman tidka perlu lagi disiram
		void Hujan();
		//method untuk mengatur waktu terjadinya topan
		//terjadinya topan akan merusak tanaman yang ada di lahan secara acak
		void Topan();
		//method untuk mengatur waktu terjadinya razia
		//jika terjadi razia, maka player memiliki dua pilihan, yaitu membayar polisi agat tanaman yang ada tidak disita, atau tidak membayar, namun tanaman yang ada harus disita oleh polisi.
		void Polisi();
		//method untuk mengatur waktu terjadinya crop circle.
		//jika crop circle terjadi, maka tanaman akan menghilang secara misterius.
		void cropCircle();
private:
	int tgl, bln,msm, jam, mnt; //tanggal, bulan , musim, jam, menit pada waktu sekarang
	int bnc; //current bencana, menunjukkan bencana yang terjadi saat ini.
	int tglb, blnb, msmb, jamb, mntb; //tanggal, bulan , musim, jam, menit waktu terjadinya crop circle
	int tglh, blnh, msmh, jamh, mnth; //tanggal, bulan , musim, jam, menit  terjadinya hujan
	int tglr, blnr, msmr, jamr, mntr; //tanggal, bulan , musim, jam, menit  terjadinya razia polisi
	int tglt, blnt, msmt, jamt, mntt; //tanggal, bulan , musim, jam, menit  terjadinya topan
	int cb, ch, cr, ct; //counter untuk cropcircle, hujan, razia, atau topan
};
#endif
